#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <unistd.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/sysmacros.h>
#include <sys/stat.h>
#include <dirent.h>
#include <pwd.h>
#include <grp.h>

int main(int argc, char const *argv[])
{
    if(argc != 2)
    {
        perror("文件");
        return 0;
    }

    struct  stat st;
    stat(argv[1],&st);

    // 输出设备号
    // 是特定的设备文件，那么st_rdv有效且st_size无效
    if(S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode))
    {
        printf("主设备号：%d\n次设备号：%d\n",
        major(st.st_rdev),minor(st.st_rdev));
    }
    else
    {
        printf("文件大小：%ld\n",st.st_size);
        printf("所在主设备号：%d\n所在次设备号：%d\n",
        major(st.st_rdev),minor(st.st_rdev));
    }
    
    char mod[10];
    bzero(mod,10);

    char rwx[3] = {'r','w','x'};
    for(int i=0; i<9; i++)
        mod[i] = st.st_mode&(0400>>i) ? rwx[i%3] : '-';

    printf("文件权限：%s\n",mod);
    
    struct passwd *pw = getpwuid(st.st_uid);
    if(pw == NULL)
    {
        perror("用户");
        return 0;
    }
    printf("所有者：%s\n",pw->pw_name);
    struct group *gr = getgrgid(st.st_gid);
    if(gr == NULL)
    {
        perror("所有组");
        return 0;
    }
    printf("所有组：%s\n",gr->gr_name);

    return 0;
}
